Para a elaboração de gráficos, utilizaremos as funções do pacote ggplot2. Em regra, essas funções são de fácil assimilação após pouco tempo de treino.
De modo geral, a elaboração de um gráfico com o pacote ggplot2 não costuma ser uma tarefa difícil, desde que o aluno tenha em mente três coisas:
Uma ideia clara de qual gráfico se quer elaborar;
O entendimento de que as funções do pacote ggplot2 construirão um gráfico a partir de, necessariamente, um data frame;
A compreensão de que sempre deverá ser comandada, no mínimo, um tipo de geometria.
Obviamente, a depender das razões do discente, pode haver gráficos que dependerão de um nível alto de erudição no R. Porém, para a maior das necessidades desse curso, o aluno encontrará soluções interessantes nos códigos abaixo.
Dito isso, vamos comandar os pacotes necessários para essa aula:
library(tidyverse)
library(plotly)
library(ggrepel)
library(PerformanceAnalytics)
library(reshape2)
Vamos carregar nossa base de dados que será utilizada para a construção de um gráfico de barras.
load("perfil_investidor.RData")
Aplicando a sintaxe básica do ggplot2 à base de dados:
Note que a nomenclatura dos perfis foi ordenada de forma alfabética. Para alterar a situação, podemos utilizar a função factor(), para redefinir a ordem dos levels:
perfil_investidor$perfil <- factor(perfil_investidor$perfil,
levels = c("Conservador",
"Moderado",
"Agressivo"))
Utilizando, mais uma vez, a sintaxe básica do ggplot2 à base de dados:
ggplot(data = perfil_investidor) +
geom_bar(aes(x = perfil))
Adicionando informações ao nosso gráfico:
ggplot(data = perfil_investidor) +
geom_bar(aes(x = perfil)) +
labs(title = "Perfil dos Investidores do Banco X",
x = "Perfil do Investidor",
y = "Quantidade")
Adicionando detalhamentos ao gráfico:
ggplot(data = perfil_investidor) +
geom_bar(aes(x = perfil)) +
labs(title = "Perfil dos Investidores",
subtitle = "Banco X",
x = "Perfil do Investidor",
y = "Quantidade",
caption = "Período: 2021")
Adicionando cores à plotagem:
ggplot(data = perfil_investidor) +
geom_bar(aes(x = perfil), fill = "darkorchid") +
labs(title = "Perfil dos Investidores",
subtitle = "Banco X",
x = "Perfil do Investidor",
y = "Quantidade",
caption = "Período: 2021")
Para verificar as cores possíveis de serem declaradas com a linguagem básica do R, podemos acessar o seguinte sítio eletrônico:
Espécie de catálogo de cores para gráficos no R
Alterando as cores:
ggplot(data = perfil_investidor) +
geom_bar(aes(x = perfil), fill = "orange") +
labs(title = "Perfil dos Investidores",
subtitle = "Banco X",
x = "Perfil do Investidor",
y = "Quantidade",
caption = "Período: 2021")
Adicionando bordas:
ggplot(data = perfil_investidor) +
geom_bar(aes(x = perfil), color = "darkorchid", fill = "orange") +
labs(title = "Perfil dos Investidores",
subtitle = "Banco X",
x = "Perfil do Investidor",
y = "Quantidade",
caption = "Período: 2021")
Modificando o fundo dos gráficos:
ggplot(data = perfil_investidor) +
geom_bar(aes(x = perfil), color = "darkorchid", fill = "orange") +
labs(title = "Perfil dos Investidores",
subtitle = "Banco X",
x = "Perfil do Investidor",
y = "Quantidade",
caption = "Período: 2021") +
theme_linedraw()
Adicionando labels:
ggplot(data = perfil_investidor) +
geom_bar(aes(x = perfil), color = "darkorchid", fill = "orange") +
geom_label(aes(x = perfil, label = ..count..), stat = "count") +
labs(title = "Perfil dos Investidores",
subtitle = "Banco X",
x = "Perfil do Investidor",
y = "Quantidade",
caption = "Período: 2021") +
theme_light()
Reposicionando as labels:
ggplot(data = perfil_investidor) +
geom_bar(aes(x = perfil), color = "darkorchid", fill = "orange") +
geom_text(aes(x = perfil, label = ..count..),
stat = "count", vjust = 2) +
labs(title = "Perfil dos Investidores",
subtitle = "Banco X",
x = "Perfil do Investidor",
y = "Quantidade",
caption = "Período: 2021") +
theme_light()
Rotacionando um gráfico:
ggplot(data = perfil_investidor) +
geom_bar(aes(x = perfil), color = "darkorchid", fill = "orange") +
geom_text(aes(x = perfil, label = ..count..), stat = "count", hjust = -0.5) +
labs(title = "Perfil dos Investidores",
subtitle = "Banco X",
x = "Perfil do Investidor",
y = "Quantidade",
caption = "Período: 2021") +
coord_flip() +
theme_light()
Invertendo as ordens das categorias:
ggplot(data = perfil_investidor) +
geom_bar(aes(x = fct_rev(perfil)), color = "darkorchid", fill = "orange") +
geom_text(aes(x = perfil, label = ..count..),
stat = "count", hjust = -1) +
labs(title = "Perfil dos Investidores",
subtitle = "Banco X",
x = "Perfil do Investidor",
y = "Quantidade",
caption = "Período: 2021") +
coord_flip() +
theme_light()
Vamos utilizar alguns dados sobre os municípios de São Paulo para essa nova demanda:
load("dados_sp.RData")
Aplicando a sintaxe básica do ggplot2:
ggplot(data = dados_sp) +
geom_histogram(aes(x = idh))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Colorindo o gráfico:
ggplot(data = dados_sp) +
geom_histogram(aes(x = idh), fill = "darkorchid")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Alterando o plano de fundo:
ggplot(data = dados_sp) +
geom_histogram(aes(x = idh), fill = "darkorchid") +
theme_minimal()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Adicionando contornos e nomes dos eixos:
ggplot(data = dados_sp) +
geom_histogram(aes(x = idh), fill = "darkorchid", color = "black") +
labs(x = "IDH dos Municípios de SP",
y = "Frequência") +
theme_minimal()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Alterando a quantidade de caixas do histograma:
ggplot(data = dados_sp) +
geom_histogram(aes(x = pib), fill = "darkorchid",
color = "black", bins = 100) +
labs(x = "PIB dos Municípios de SP",
y = "Frequência") +
theme_minimal()
Para esse desafio, utilizaremos dados sobre os bairros da capital de São Paulo:
load("atlas_ambiental.RData")
Aplicando a sintaxe básica do ggplot2:
ggplot(atlas_ambiental) +
geom_point(aes(x = renda, y = escolaridade))
Estratificando informações - o uso do argumento size:
ggplot(atlas_ambiental) +
geom_point(aes(x = renda, y = escolaridade, size = idade))
Estratificando informações - o uso do argumento color:
ggplot(atlas_ambiental) +
geom_point(aes(x = renda, y = escolaridade,
size = idade, color = favel < 6))
Estratificando informações - o uso do argumento shape:
ggplot(atlas_ambiental) +
geom_point(aes(x = renda, y = escolaridade,
size = idade, color = favel < 6,
shape = mortalidade > 18)) +
labs(title = "Indicadores dos Distritos do Município de São Paulo",
x = "Renda",
y = "Escolaridade") +
theme_bw()
Traçando uma linha de tendências:
ggplot(atlas_ambiental) +
geom_point(aes(x = renda, y = escolaridade,
size = idade, color = favel < 6,
shape = mortalidade > 18)) +
geom_smooth(aes(x = renda, y = escolaridade),
method = "loess", se = FALSE) +
labs(title = "Indicadores dos Distritos do Município de São Paulo",
x = "Renda",
y = "Escolaridade") +
theme_bw()
## `geom_smooth()` using formula 'y ~ x'
Aproveitando o assunto “tendências”, vamos seguir explorando as capacidades do R com uma nova base de dados sobre a corrupção no mundo (Fisman & Miguel, 2007):
load("fisman_miguel.RData")
Notem que seria interessante plotar, por exemplo, o número de violações de trânsito em função do índice de corrupção do país. Vamos tentar?
ggplot(fisman_miguel) +
geom_point(aes(x = corruption, y = violations)) +
geom_smooth(aes(x = corruption, y = violations),
se = FALSE,
method = "loess") +
geom_text(aes(x = corruption, y = violations, label = code))
## `geom_smooth()` using formula 'y ~ x'
Note que há dois problemas principais: 1) Há muitos países sem violações reportadas, ou com um baixo número de violações, e países com um número alto de violações reportadas, o que deixaria o gráfico com problemas de escala; 2) Haveria uma dupla contagem, porque os países foram verificados antes e depois da imposição da nova lei de NY.
Vamos tentar mitigar o primeiro problema, padronizando os valores da variável violations
ggplot(fisman_miguel) +
geom_point(aes(x = corruption, y = log(violations))) +
geom_smooth(aes(x = corruption, y = log(violations)),
se = F,
method = "loess") +
geom_text(aes(x = corruption, y = log(violations), label = code))
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 65 rows containing non-finite values (stat_smooth).
Agora, podemos tentar mitigar o segundo problema com alguma função de
facet:
ggplot(fisman_miguel) +
geom_point(aes(x = corruption, y = log(violations))) +
geom_smooth(aes(x = corruption, y = log(violations)),
se = F,
method = "loess") +
geom_text(aes(x = corruption, y = log(violations), label = code)) +
facet_wrap(~post) +
theme_bw()
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 65 rows containing non-finite values (stat_smooth).
Note um terceiro problema não identificado anteriormente: a sobreposição de labels. Podemos tentar resolver a situação com a função geom_text_repel(), do pacote ggrepel:
ggplot(fisman_miguel) +
geom_point(aes(x = corruption, y = log(violations))) +
geom_smooth(aes(x = corruption, y = log(violations)),
se = F, method = "loess") +
geom_text_repel(aes(x = corruption, y = log(violations), label = code)) +
facet_wrap(~post) +
theme_bw()
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 65 rows containing non-finite values (stat_smooth).
## Warning: ggrepel: 93 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 124 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
Para os nossos gráficos de linhas, vamos utilizar dados da atual pandemia no Brasil, Índia, Rússia e Estados Unidos da América:
load("covid_110521.RData")
Aplicando a sintaxe básica do ggplot2:
ggplot(covid_110521) +
geom_line(aes(x = t, y = cumulative_cases))
Note que não informamos para o ggplot2 que cada linha deveria representar um país. Assim:
ggplot(covid_110521) +
geom_line(aes(x = t, y = cumulative_cases, color = country))
Adicionando informações e deixando o gráfico mais elegante:
ggplot(covid_110521) +
geom_line(aes(x = t, y = cumulative_cases, color = country)) +
geom_point(aes(x = t, y = cumulative_cases, color = country)) +
labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
y = "Casos Cumulativos",
color = "País") +
theme_bw()
O gráfico anterior poderia ser mais informativo, visto que, por exemplo,
compara países com tamanhos populacionais distintos. Portanto, a
magnitude das infecções também é distinta. Uma possibilidade de
suavização da situação poderia ser a padronização da variável
‘cumulative_cases’. No gráfico a seguir, padronizamos os casos
cumulativos de cada país numa escala log10:
covid_110521["log_ccases"] <- log10(covid_110521$cumulative_cases)
O gráfico resultante é o seguinte:
ggplot(covid_110521) +
geom_line(aes(x = t, y = log_ccases, color = country)) +
geom_point(aes(x = t, y = log_ccases, color = country)) +
labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
y = "Log10 Casos Cumulativos",
color = "País") +
theme_bw()
Por mais que dê para se extrair alguns insights interessantes do gráfico anterior, alguém poderia dizer que seria melhor, por exemplo, utilizar uma proporção da população infectada em razão do tempo passado:
covid_110521["pop_ccases"] <- covid_110521$cumulative_cases /
covid_110521$pop
O resultado visual vem abaixo:
ggplot(covid_110521) +
geom_line(aes(x = t, y = pop_ccases, color = country)) +
geom_point(aes(x = t, y = pop_ccases, color = country)) +
labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
y = "Casos Cumulativos",
color = "País") +
theme_bw()
Ainda assim, os gráficos não trazem uma informação importante: os valores dos casos cumulativos por dia e por país. Em regra, no ggplot, podemos utilizar a geometria ‘text’ para isso:
ggplot(covid_110521) +
geom_line(aes(x = t, y = cumulative_cases, color = country)) +
geom_point(aes(x = t, y = cumulative_cases, color = country)) +
geom_text(aes(x = t, y = cumulative_cases, label = cumulative_cases),
color = "black", size = 2) +
labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
y = "Casos Cumulativos",
color = "País") +
theme_bw()
E se deslocássemos as labels dos valores dos casos cumulativos?
ggplot(covid_110521) +
geom_line(aes(x = t, y = cumulative_cases, color = country)) +
geom_point(aes(x = t, y = cumulative_cases, color = country)) +
geom_text(aes(x = t, y = cumulative_cases, label = cumulative_cases),
color = "black", size = 2, vjust = -1) +
labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
y = "Casos Cumulativos",
color = "País") +
theme_bw()
Ainda está caótico, certo? E se alterássemos o ângulo de exibição das labels?
ggplot(covid_110521) +
geom_line(aes(x = t, y = cumulative_cases, color = country)) +
geom_point(aes(x = t, y = cumulative_cases, color = country)) +
geom_text(aes(x = t, y = cumulative_cases, label = cumulative_cases),
color = "black", size = 2, vjust = -1, angle = 45) +
labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
y = "Casos Cumulativos",
color = "País") +
theme_bw()
Continua péssimo. São muitos dias e muitos países analisados ao mesmo tempo!
A função geom_text_repel() do pacote ‘ggrepel’, por vezes resolve o problema:
ggplot(covid_110521) +
geom_line(aes(x = t, y = cumulative_cases, color = country)) +
geom_point(aes(x = t, y = cumulative_cases, color = country)) +
geom_text_repel(aes(x = t, y = cumulative_cases, label = cumulative_cases),
color = "black", size = 2) +
labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
y = "Casos Cumulativos",
color = "País") +
theme_bw()
## Warning: ggrepel: 1244 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
Dá até vontade de desistir, a gente sabe! Em casos extremos, como no exemplo apresentado, talvez seja melhor omitir as labels e deixar o gráfico interativo com o usuário da informação. Podemos fazer isso com a função ggplotly() do pacote ‘plotly’:
ggplotly(
ggplot(covid_110521) +
geom_line(aes(x = t, y = cumulative_cases, color = country)) +
geom_point(aes(x = t, y = cumulative_cases, color = country)) +
labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
y = "Casos Cumulativos",
color = "País") +
theme_bw()
)
Agora passa passar o mouse pelo gráfico para ter acesso às informações necessárias!
Caso quiséssemos fazer uma análise diária, bastaria mudar a variável de interesse:
ggplotly(
ggplot(covid_110521) +
geom_line(aes(x = t, y = daily_cases, color = country)) +
geom_point(aes(x = t, y = daily_cases, color = country)) +
labs(x = "Tempo em dias desde o primeiro caso oficial do Sars-Cov-2 reportado",
y = "Casos Diários",
color = "País") +
theme_bw()
)
Nosso principal exemplo para gráficos de calor para hoje será a respeito da relação entre variáveis. Entre variáveis métricas, essas relações se chamam correlações, cuja fórmula do coeficiente de correlação de Pearson segue a seguir:
\(\rho = \frac{\sum_{i=1}^{n}(X_{i}-\bar{X}).(Y_{i}-\bar{Y})}{\sqrt{\sum_{i=1}^{n}(X_{i}-\bar{X})^2.\sqrt{\sum_{i=1}^{n}(Y_{i}-\bar{Y})^2}}}\)
Assim, primeiro vamos observar alguns gráficos correlacionais com a função chart.Correlation() do pacote ’PerformanceAnalytics”:
chart.Correlation(atlas_ambiental[, 3:11], histogram = T)
Para criarmos um gráfico de calor a respeito das correlações da nossa
base de dados, o primeiro passo é estabelecer uma Matriz de Correlações.
Podemos fazer isso utilizando a função cor() da linguagem básica do
R:
matriz_correlacoes <- cor(atlas_ambiental[, 3:11])
matriz_correlacoes
## renda quota escolaridade idade mortalidade
## renda 1.00000000 0.92009937 0.7773322 0.7323071 -0.51958497
## quota 0.92009937 1.00000000 0.8504546 0.8327369 -0.52028200
## escolaridade 0.77733216 0.85045460 1.0000000 0.9558249 -0.58260085
## idade 0.73230705 0.83273686 0.9558249 1.0000000 -0.55375832
## mortalidade -0.51958497 -0.52028200 -0.5826008 -0.5537583 1.00000000
## txcresc -0.42471079 -0.55476724 -0.6929676 -0.7032367 0.34604928
## causasext -0.46251567 -0.49101971 -0.6066208 -0.6150734 0.42278951
## favel -0.14695749 -0.24301018 -0.4325480 -0.4998385 0.13087742
## denspop -0.01971076 0.05737442 0.1576728 0.1414692 -0.09301763
## txcresc causasext favel denspop
## renda -0.4247108 -0.46251567 -0.1469575 -0.01971076
## quota -0.5547672 -0.49101971 -0.2430102 0.05737442
## escolaridade -0.6929676 -0.60662084 -0.4325480 0.15767283
## idade -0.7032367 -0.61507339 -0.4998385 0.14146917
## mortalidade 0.3460493 0.42278951 0.1308774 -0.09301763
## txcresc 1.0000000 0.23447240 0.2818525 -0.27908375
## causasext 0.2344724 1.00000000 0.4044469 -0.04528098
## favel 0.2818525 0.40444685 1.0000000 -0.10648120
## denspop -0.2790838 -0.04528098 -0.1064812 1.00000000
Para o caso dos gráficos de calor, é melhor que a base de dados esteja no formato long em vez do formato wide. Podemos alterar isso com a função melt() do pacote ‘reshape2’
?melt
## Help on topic 'melt' was found in the following packages:
##
## Package Library
## data.table /home/erick/R/x86_64-pc-linux-gnu-library/4.1
## reshape2 /home/erick/R/x86_64-pc-linux-gnu-library/4.1
##
##
## Using the first match ...
correlacoes <- melt(matriz_correlacoes)
head(correlacoes)
## Var1 Var2 value
## 1 renda renda 1.0000000
## 2 quota renda 0.9200994
## 3 escolaridade renda 0.7773322
## 4 idade renda 0.7323071
## 5 mortalidade renda -0.5195850
## 6 txcresc renda -0.4247108
tail(correlacoes)
## Var1 Var2 value
## 76 idade denspop 0.14146917
## 77 mortalidade denspop -0.09301763
## 78 txcresc denspop -0.27908375
## 79 causasext denspop -0.04528098
## 80 favel denspop -0.10648120
## 81 denspop denspop 1.00000000
Aqui, nós vamos alterar os nomes das variáveis do nosso novo objeto que demos o nome de ‘correlacoes’:
names(correlacoes) <- c("var1", "var2", "correlacao")
correlacoes
## var1 var2 correlacao
## 1 renda renda 1.00000000
## 2 quota renda 0.92009937
## 3 escolaridade renda 0.77733216
## 4 idade renda 0.73230705
## 5 mortalidade renda -0.51958497
## 6 txcresc renda -0.42471079
## 7 causasext renda -0.46251567
## 8 favel renda -0.14695749
## 9 denspop renda -0.01971076
## 10 renda quota 0.92009937
## 11 quota quota 1.00000000
## 12 escolaridade quota 0.85045460
## 13 idade quota 0.83273686
## 14 mortalidade quota -0.52028200
## 15 txcresc quota -0.55476724
## 16 causasext quota -0.49101971
## 17 favel quota -0.24301018
## 18 denspop quota 0.05737442
## 19 renda escolaridade 0.77733216
## 20 quota escolaridade 0.85045460
## 21 escolaridade escolaridade 1.00000000
## 22 idade escolaridade 0.95582487
## 23 mortalidade escolaridade -0.58260085
## 24 txcresc escolaridade -0.69296759
## 25 causasext escolaridade -0.60662084
## 26 favel escolaridade -0.43254796
## 27 denspop escolaridade 0.15767283
## 28 renda idade 0.73230705
## 29 quota idade 0.83273686
## 30 escolaridade idade 0.95582487
## 31 idade idade 1.00000000
## 32 mortalidade idade -0.55375832
## 33 txcresc idade -0.70323674
## 34 causasext idade -0.61507339
## 35 favel idade -0.49983847
## 36 denspop idade 0.14146917
## 37 renda mortalidade -0.51958497
## 38 quota mortalidade -0.52028200
## 39 escolaridade mortalidade -0.58260085
## 40 idade mortalidade -0.55375832
## 41 mortalidade mortalidade 1.00000000
## 42 txcresc mortalidade 0.34604928
## 43 causasext mortalidade 0.42278951
## 44 favel mortalidade 0.13087742
## 45 denspop mortalidade -0.09301763
## 46 renda txcresc -0.42471079
## 47 quota txcresc -0.55476724
## 48 escolaridade txcresc -0.69296759
## 49 idade txcresc -0.70323674
## 50 mortalidade txcresc 0.34604928
## 51 txcresc txcresc 1.00000000
## 52 causasext txcresc 0.23447240
## 53 favel txcresc 0.28185252
## 54 denspop txcresc -0.27908375
## 55 renda causasext -0.46251567
## 56 quota causasext -0.49101971
## 57 escolaridade causasext -0.60662084
## 58 idade causasext -0.61507339
## 59 mortalidade causasext 0.42278951
## 60 txcresc causasext 0.23447240
## 61 causasext causasext 1.00000000
## 62 favel causasext 0.40444685
## 63 denspop causasext -0.04528098
## 64 renda favel -0.14695749
## 65 quota favel -0.24301018
## 66 escolaridade favel -0.43254796
## 67 idade favel -0.49983847
## 68 mortalidade favel 0.13087742
## 69 txcresc favel 0.28185252
## 70 causasext favel 0.40444685
## 71 favel favel 1.00000000
## 72 denspop favel -0.10648120
## 73 renda denspop -0.01971076
## 74 quota denspop 0.05737442
## 75 escolaridade denspop 0.15767283
## 76 idade denspop 0.14146917
## 77 mortalidade denspop -0.09301763
## 78 txcresc denspop -0.27908375
## 79 causasext denspop -0.04528098
## 80 favel denspop -0.10648120
## 81 denspop denspop 1.00000000
Agora sim, aplicando a sintaxe básica do ggplot2, temos:
ggplot(correlacoes) +
geom_tile(aes(x = var1, y = var2, fill = correlacao))
Podemos remover os nomes dos eixos do gráfico da seguinte forma:
ggplot(correlacoes) +
geom_tile(aes(x = var1, y = var2, fill = correlacao)) +
labs(x = NULL,
y = NULL,
fill = "Correlações")
Podemos criar um gradiente de cores, da seguinte maneira:
ggplot(correlacoes) +
geom_tile(aes(x = var1, y = var2, fill = correlacao)) +
labs(x = NULL,
y = NULL,
fill = "Correlações") +
scale_fill_gradient2(low = "#440154FF",
mid = "white",
high = "#FDE725FF",
midpoint = 0)
Podemos incluir os valores de cada correlação em cada quadrícula:
ggplot(correlacoes) +
geom_tile(aes(x = var1, y = var2, fill = correlacao)) +
geom_text(aes(x = var1, y = var2, label = correlacao), size = 2) +
labs(x = NULL,
y = NULL,
fill = "Correlações") +
scale_fill_gradient2(low = "darkblue",
mid = "white",
high = "darkred",
midpoint = 0)
Os valores das correlações estão muito extensos, certo? Basta aplicarmos um arredondamento a eles com a função round():
ggplot(correlacoes) +
geom_tile(aes(x = var1, y = var2, fill = correlacao)) +
geom_text(aes(x = var1, y = var2, label = round(correlacao, digits = 3)),
size = 3) +
labs(x = NULL,
y = NULL,
fill = "Correlações") +
scale_fill_gradient2(low = "darkblue",
mid = "white",
high = "darkred",
midpoint = 0) +
theme_bw()
Lembra da ggplotly() do pacote ‘plotly’? Pois é! Podemos aplicá-la aqui também!
ggplotly(
ggplot(correlacoes) +
geom_tile(aes(x = var1, y = var2, fill = correlacao)) +
geom_text(aes(x = var1, y = var2,
label = round(correlacao, digits = 3)),
size = 3) +
labs(x = NULL,
y = NULL,
fill = "Correlações") +
scale_fill_gradient2(low = "darkblue",
mid = "white",
high = "darkred",
midpoint = 0) +
theme_bw()
)
Os nomes das variáveis estão sobrepostos no eixo das abcissas. Podemos resolver isso com argumentos à função theme():
ggplot(correlacoes) +
geom_tile(aes(x = var1, y = var2, fill = correlacao)) +
geom_text(aes(x = var1, y = var2, label = round(correlacao,
digits = 3)),
size = 3) +
labs(x = NULL,
y = NULL,
fill = "Correlações") +
scale_fill_gradient2(low = "darkblue",
mid = "white",
high = "darkred",
midpoint = 0) +
theme(panel.background = element_rect("white"),
panel.grid = element_line("grey95"),
panel.border = element_rect(NA),
legend.position = "bottom",
axis.text.x = element_text(angle = 90))
No R, para construir alguns boxplots, é melhor que utilizemos nossas bases de dados no formato long. Basta utilizarmos a função melt() do pacote ‘reshape2’:
atlas_long <- melt(atlas_ambiental[, 2:11], id.vars = "distritos")
head(atlas_long)
## distritos variable value
## 1 Água Rasa renda 1961
## 2 Alto de Pinheiros renda 4180
## 3 Anhanguera renda 1093
## 4 Aricanduva renda 1311
## 5 Artur Alvim renda 1248
## 6 Barra Funda renda 2359
tail(atlas_long)
## distritos variable value
## 859 Vila Matilde denspop 111.70
## 860 Vila Medeiros denspop 188.93
## 861 Vila Prudente denspop 101.44
## 862 Vila Sônia denspop 80.12
## 863 São Domingos denspop 72.92
## 864 Lajeado denspop 141.01
Agora sim, podemos plotar nossos dados:
ggplot(atlas_long) +
geom_boxplot(aes(x = variable, y = value, fill = variable))
A visualização ficou diferente do esperado, não é? Você consegue dizer a razão disso?
O problema está na comparação de variáveis com tipos distintos de magnitude.
Podemos resolver a situação padronizando as variáveis com o procedimento zscores, por exemplo:
\(zX_{i}=\frac{X_{i}-\bar{X}}{\sigma}\)
atlas_padronizado <- atlas_ambiental
atlas_padronizado[, 3:11] <- scale(atlas_padronizado[, 3:11])
head(atlas_padronizado)
## # A tibble: 6 × 11
## cód_ibge distritos renda quota escolaridade idade mortalidade txcresc
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 Água Rasa 0.108 0.180 0.520 1.05 -0.427 -0.536
## 2 2 Alto de Pinhe… 2.39 1.97 1.31 1.28 -1.46 -0.730
## 3 3 Anhanguera -0.786 -1.13 -1.26 -1.00 -0.127 5.15
## 4 4 Aricanduva -0.562 -0.411 -0.273 -0.0903 0.488 -0.317
## 5 5 Artur Alvim -0.627 -0.632 -0.0743 -0.0903 0.748 -0.411
## 6 6 Barra Funda 0.518 0.166 0.917 0.822 -1.48 -0.621
## # … with 3 more variables: causasext <dbl>, favel <dbl>, denspop <dbl>
tail(atlas_padronizado)
## # A tibble: 6 × 11
## cód_ibge distritos renda quota escolaridade idade mortalidade txcresc
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 91 Vila Matilde -0.336 -0.194 0.322 0.366 0.628 -0.533
## 2 92 Vila Medeiros -0.465 -0.465 -0.273 -0.0903 -0.113 -0.413
## 3 93 Vila Prudente -0.104 0.0695 0.124 0.594 -0.327 -0.738
## 4 94 Vila Sônia 1.15 0.474 0.322 -0.0903 0.154 -0.268
## 5 95 São Domingos 0.197 -0.302 -0.273 -0.318 -0.339 0.191
## 6 96 Lajeado -1.11 -0.954 -1.66 -1.46 0.532 0.795
## # … with 3 more variables: causasext <dbl>, favel <dbl>, denspop <dbl>
Como já visto, devemos transformar nossa base de dados em formato long:
atlas_padronizado_long <- melt(atlas_padronizado[, 2:11],
id.vars = "distritos")
head(atlas_padronizado_long)
## distritos variable value
## 1 Água Rasa renda 0.1079357
## 2 Alto de Pinheiros renda 2.3937396
## 3 Anhanguera renda -0.7861958
## 4 Aricanduva renda -0.5616328
## 5 Artur Alvim renda -0.6265294
## 6 Barra Funda renda 0.5179177
tail(atlas_padronizado_long)
## distritos variable value
## 859 Vila Matilde denspop 0.23867472
## 860 Vila Medeiros denspop 1.79551721
## 861 Vila Prudente denspop 0.03184841
## 862 Vila Sônia denspop -0.39793125
## 863 São Domingos denspop -0.54307270
## 864 Lajeado denspop 0.82952092
Vamos tentar, mais uma vez, utilizar a sintaxe básica do ggplot2 para a construção de boxplots:
ggplot(atlas_padronizado_long) +
geom_boxplot(aes(x = variable, y = value, fill = variable))
Podemos deixar o gráfico mais elegante nomeando os eixos, alterando o plano de fundo e removendo a legenda:
ggplot(atlas_padronizado_long) +
geom_boxplot(aes(x = variable, y = value, fill = variable)) +
labs(x = "Variáveis",
y = "Valores") +
theme(panel.background = element_rect("white"),
panel.grid = element_line("grey95"),
panel.border = element_rect(NA),
legend.position = "none",
axis.text.x = element_text(angle = 90))
Com objetivos puramente didáticos, podemos visualizar cada observação de cada variável padronizada da seguinte maneira:
ggplot(atlas_padronizado_long) +
geom_boxplot(aes(x = variable, y = value, fill = variable)) +
geom_point(aes(x = variable, y = value), alpha = 0.1) +
labs(x = "Variáveis",
y = "Valores") +
theme(panel.background = element_rect("white"),
panel.grid = element_line("grey95"),
panel.border = element_rect(NA),
legend.position = "none",
axis.text.x = element_text(angle = 90))
E sim! Podemos deixas nossos boxplots interativos com ajuda do pacote ‘plotly’
ggplotly(
ggplot(atlas_padronizado_long) +
geom_boxplot(aes(x = variable, y = value, fill = variable)) +
labs(x = "Variáveis",
y = "Valores") +
theme_bw()
)